package com.cd.music.service;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.cd.music.dto.ResultBean;
import com.cd.music.protocol.AuthCodeProtocol;
import com.cd.music.utils.EncryptUtil;
import com.cd.music.utils.FormatValidateUtil;
import com.cd.music.utils.StringUtil;
import org.apache.log4j.Logger;

import java.util.HashMap;
import java.util.Map;

/**
 * @author yxl 余秀良
 * @version 1.0
 * @description: 用途
 * @date 2018年02月27日  下午2:23
 * @address: 四川成都
 */
public class AbstractAuthCodeService {
    Logger logger = Logger.getLogger(AbstractAuthCodeService.class);

    /**
     * @author yxl 余秀良
     * @version 1.0
     * @description: 登录用发送短信的方法
     * @date 2018年02月27日 下午3:53
     * @address: 四川成都
     */
    public final ResultBean login(String phone) {
        return sendSMS(phone, AuthCodeProtocol.LOGINSMSTEMPLATEID);
    }

    /**
     * @author yxl 余秀良
     * @version 1.0
     * @description: 修改密码发送验证码
     * @date 2018年02月27日 下午3:19
     * @address: 四川成都
     **/
    public final ResultBean updatePwd(String phone) {
        return sendSMS(phone, AuthCodeProtocol.UPDATEPWDSMSTEMPLATEID);
    }

    /**
     * @author yxl 余秀良
     * @version 1.0
     * @description: 注册发送验证码
     * @date 2018年02月27日 下午3:19
     * @address: 四川成都
     **/
    public final ResultBean register(String phone) {
        return sendSMS(phone, AuthCodeProtocol.REGSMSTEMPLATEID);
    }

    /**
     * 随机生成6位验证码
     *
     * @return 返回生成好的验证码
     */
    private String authCode() {
        String code = "";
        //随机数位数
        int num = 6;
        for (int i = 0; i < num; i++) {
            int tempCode = (int) (Math.random() * (9 - 1) + 1);
            code = code.concat(tempCode + "");
        }
        return code;
    }

    /**
     * 通用发送短信方法
     *
     * @param phone      　手机号码
     * @param templateId 　短信模板id
     * @return 返回成功或失败的消息
     */
    private ResultBean sendSMS(String phone, String templateId) {
        try {
            if (!StringUtil.isEmpty(phone) && FormatValidateUtil.isMobile(phone)) {
                IClientProfile profile = DefaultProfile.getProfile(AuthCodeProtocol.REGIONID, EncryptUtil.decryption(AuthCodeProtocol.APPKEY), EncryptUtil.decryption(AuthCodeProtocol.SECRET));
                DefaultProfile.addEndpoint(AuthCodeProtocol.REGIONID, AuthCodeProtocol.REGIONID, EncryptUtil.decryption(AuthCodeProtocol.PRODUCT), EncryptUtil.decryption(AuthCodeProtocol.URL));
                IAcsClient client = new DefaultAcsClient(profile);
                SendSmsRequest request = new SendSmsRequest();
                //手机号
                request.setPhoneNumbers(phone);
                //短信签名
                request.setSignName(AuthCodeProtocol.SMSFREESIGNNAME);
                //短信模板
                request.setTemplateCode(templateId);
                //封装参数
                Map<String, Object> paramMap = new HashMap<>(16);
                String authCode = authCode();
                paramMap.put("code", authCode);
                //模板中的变量替换JSON串
                request.setTemplateParam(JSON.toJSONString(paramMap));
                //扩展字段
                request.setOutId(phone);
                //发送请求
                SendSmsResponse response = client.getAcsResponse(request);
                logger.error(JSON.toJSONString(response));
                //如果请求成功
                return result(authCode, response);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通用的接收验证码方法
     *
     * @param authCode 验证码
     * @param response 验证码平台返回的数据集合
     */
    private ResultBean result(String authCode, SendSmsResponse response) {
        ResultBean.Builder builder = ResultBean.builder();
        //如果请求成功
        if (response.getCode() != null && response.getCode().equals(AuthCodeProtocol.RESULTKEY)) {
            builder.code(200).data(authCode).success(true).message(response.getMessage());
            //如果请求失败
        } else {
            builder.code(500).data(authCode).success(false).message(getErrorMessage(response.getCode()));
        }
        return builder.build();
    }

    private String getErrorMessage(String msg) {
        String resultMessage;
        switch (msg) {
            case AuthCodeProtocol.BUSINESS_LIMIT_CONTROL:
                resultMessage = "同一个手机号码一分钟可以发送1条,一小时可以发送5条 ,一天可以发送10条";
                break;
            case AuthCodeProtocol.MOBILE_NUMBER_ILLEGAL:
                resultMessage = "手机号码不不正确,请传入11位国内号段的手机号码";
                break;
            case AuthCodeProtocol.OUT_OF_SERVICE:
                resultMessage = "该业务已停机,请联系管理员";
                break;
            default:
                resultMessage = "网络波动,请稍候再试.......";
                break;
        }
        return resultMessage;
    }

}
